import os
from typing import Optional, Dict, Any
import chardet  # 用于检测文件编码的第三方库


def open_file(file_path: str) -> Optional[str]:
    """
    安全打开文件并返回内容
    """
    if not os.path.exists(file_path):
        print(f"错误：文件 '{file_path}' 不存在！")
        return None

    try:
        # 检测文件编码
        with open(file_path, 'rb') as f:
            raw_data = f.read()
            encoding = chardet.detect(raw_data)['encoding']

        # 用检测到的编码打开文件
        with open(file_path, 'r', encoding=encoding) as f:
            return f.read()
    except UnicodeDecodeError:
        print(f"错误：无法解码文件 '{file_path}'，尝试使用其他编码...")
        try:
            with open(file_path, 'r', encoding='gbk') as f:
                return f.read()
        except:
            print("错误：文件解码失败！")
            return None
    except Exception as e:
        print(f"打开文件时发生错误：{e}")
        return None


def count_lines(content: str) -> int:
    """
    统计行数
    """
    return len(content.splitlines())


def count_words(content: str) -> int:
    """
    统计单词数（按空格分割）
    """
    words = content.split()
    return len(words)


def count_chars(content: str) -> int:
    """
    统计字符数（包括空格和换行符）
    """
    return len(content)


def count_specific_word(content: str, target_word: str) -> int:
    """
    统计特定单词出现次数（拓展功能）
    """
    words = content.lower().split()
    target_word = target_word.lower()
    return words.count(target_word)


def display_stats(stats: Dict[str, Any]) -> None:
    """
    显示统计结果
    """
    print("\n=== 文件统计结果 ===")
    print(f"文件路径: {stats['file_path']}")
    print(f"行数: {stats['lines']}")
    print(f"单词数: {stats['words']}")
    print(f"字符数: {stats['chars']}")

    if 'specific_word' in stats:
        print(f"单词 '{stats['specific_word']}' 出现次数: {stats['count']}")
    print("===================")


def main():
    """
    主函数
    """
    print("=== 文件内容统计工具 ===")

    file_path = input("请输入文件路径：").strip()
    content = open_file(file_path)

    if content is None:
        return

    # 基本统计
    stats = {
        'file_path': file_path,
        'lines': count_lines(content),
        'words': count_words(content),
        'chars': count_chars(content)
    }

    # 拓展功能：特定单词统计
    if input("是否统计特定单词出现次数？(y/n): ").lower() == 'y':
        target_word = input("请输入要统计的单词：").strip()
        stats.update({
            'specific_word': target_word,
            'count': count_specific_word(content, target_word)
        })

    # 显示结果
    display_stats(stats)


if __name__ == "__main__":
    # 安装依赖库（如果未安装）
    try:
        import chardet
    except ImportError:
        print("检测到缺少依赖库，正在安装 chardet...")
        import subprocess

        subprocess.check_call(["pip", "install", "chardet"])
        import chardet

    main()